package pe.edu.sisclas.model.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.edu.sisclas.model.dao.UsuarioDao;
import pe.edu.sisclas.model.dao.exception.DaoException;
import pe.edu.sisclas.model.domain.Docente;
import pe.edu.sisclas.model.domain.Usuario;

@Repository
public class UsuarioDaoImpl implements UsuarioDao {

	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public void Delete(Usuario usu) {
		try {
			Session session = getSessionFactory().getCurrentSession();
			session.createQuery(
					"UPDATE Usuario SET alta=false WHERE idUsuario='"
							+ usu.getIdUsuario() + "'").executeUpdate();
			session.beginTransaction().commit();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}

	@Override
	public Usuario getUsuario(String usuario, String contrasenia)
			throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			Usuario usuario_ = (Usuario) session
					.createQuery(
							"from Usuario u where"
									+ " (u.docente.codigoDocente = :usuario or"
									+ " u.soporte.codigoSoporte = :usuario) and"
									+ " u.contrasenia = :contrasenia and u.alta = true ")
					.setParameter("usuario", usuario)
					.setParameter("contrasenia", contrasenia).uniqueResult();
			return usuario_;
		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("Error accediendo a la base de datos.");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Docente> validarUsuario(String textoBusqueda)
			throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			List<Docente> usuarios = session
					.createQuery(
							"from Docente doc where (doc.nombreDocente like :texto or "
									+ "doc.codigoDocente like :texto) and "
									+ "doc.codigoDocente not in "
									+ "(select d.codigoDocente from Usuario usu "
									+ "inner join usu.docente d where usu.alta =true)")
					.setParameter("texto", "%" + textoBusqueda + "%")
					.setMaxResults(20).list();
			return usuarios;

		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("");
		}
	}

	@Override
	public void crearUsuario(Usuario usuario) throws DaoException {
		try {

			Session session = getSessionFactory().getCurrentSession();
			session.save(usuario);

			// } catch (org.hibernate.exception.ConstraintViolationException c)
			// {
			//
		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("Error en la base de datos");
		}

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> getUsuarios() throws DaoException {

		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			Session session = getSessionFactory().getCurrentSession();

			usuarios = session
					.createQuery(
							"select new Usuario(u.idUsuario, doc.codigoDocente, doc.nombreDocente) from Usuario u inner join u.docente doc "
									+ "where u.alta = true ").list();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return usuarios;

	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public Usuario getUsuarioByDocente(Docente docente) throws DaoException {
		try {
			Session session = getSessionFactory().getCurrentSession();
			Usuario usuario = (Usuario) session
					.createQuery(
							"from Usuario u where u.docente.codigoDocente = '"
									+ ":codigoDocente'")
					.setParameter("codigoDocente", docente.getCodigoDocente())
					.uniqueResult();
			return usuario;
		} catch (Exception e) {
			e.printStackTrace();
			throw DaoException.mensaje("Error en la base de datos");
		}
	}

}
